package com.obelisco.modelo.servicios.seguridad;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

import ucla.encuestaMatic.modelo.dao.ServicioPersonaDAO;
import ucla.encuestaMatic.modelo.data.Persona;
/*
import ucla.cumlaude.modelo.dao.IServicioDecanatoDAO;
import ucla.cumlaude.modelo.data.Decanato;
*/
import com.obelisco.exception.ObeliscoException;
import com.obelisco.modelo.beans.OrientacionMenu;
import com.obelisco.modelo.dao.ICarpetaTransaccionDAO;
import com.obelisco.modelo.dao.IUsuarioDAO;
import com.obelisco.modelo.dao.hibernate.GrupoDAO;
import com.obelisco.modelo.dao.hibernate.SistemaDAO;
import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.DataGenerica;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.Usuario;

public class ServicioAutenticarUsuario implements IServicioAutenticarUsuario {

	private IUsuarioDAO usuarioDAO;

	private ICarpetaTransaccionDAO carpetaTransaccionDAO;
	
	private IServicioSeguridad servicioSeguridad;

	Sistema sistema;
	
	// Agregados por Edgar pastran
	private ServicioPersonaDAO servicioPersonaDAO;
	private GrupoDAO grupoDAO;
	private SistemaDAO sistemaDAO;
	

	private void cargarTransacciones(Usuario usuario) {
		CarpetaTransaccion carpetaRaiz = carpetaTransaccionDAO
				.findTree(sistema,usuario);
		usuario.setFunciones(carpetaRaiz);
	}
	
	private Sistema buscarSistema() {
		List sistemas = this.sistemaDAO.findAll(Sistema.class);
		if ((sistemas != null) && (sistemas.size() > 0))
			return (Sistema)sistemas.get(0);
		return null;
	}
	
	private Grupo buscarGrupoEncuestados() {
		List<Criterion> criterios = new ArrayList<Criterion>();
		criterios.add(Restrictions.eq("id.sistema", this.buscarSistema()));
		criterios.add(Restrictions.eq("id.nombre", Grupo.GRUPO_ENCUESTADOS));
		List<Grupo> grupos = this.grupoDAO.findByCriterions(Grupo.class, criterios);
		return grupos != null && !grupos.isEmpty() ? grupos.get(0) : null;
	}
	
	private Usuario crearUsuarioPorPersona(Persona persona) {
		Usuario usuario = new Usuario();
		usuario.setLogin(persona.getCedula());
		usuario.setContrasena(persona.getCedula());
		String nombreCompleto = persona.getPrimerNombre();
		nombreCompleto += " " + (persona.getSegundoNombre() != null ? persona.getSegundoNombre() + " " : "");
		nombreCompleto += persona.getPrimerApellido();
		nombreCompleto += (persona.getSegundoApellido() != null ? " " + persona.getSegundoApellido() : "");
		usuario.setNombrecompleto(nombreCompleto);
		usuario.setDescripcion("Encuestado");
		usuario.setOrientacionMenu(OrientacionMenu.HORIZONTAL);
		Grupo grupo = buscarGrupoEncuestados(); 
		if (grupo != null)
			usuario.getGrupos().add(grupo);
		return usuario;
	}
	
	@Override
	public void chequearExistePersona(String login, String password) throws ObeliscoException {
		if (login.equals(password)) {
			List<Persona> personas = this.servicioPersonaDAO.buscarPorPropiedad("cedula", login, DataGenerica.DATA_ACTIVO); 
			if (personas != null && !personas.isEmpty()) {
				Persona persona = personas.get(0);
				List<Usuario> usuarios = this.usuarioDAO.findByProperty("login", login);
				Usuario usuario;
				if (usuarios != null && !usuarios.isEmpty())
					usuario = usuarios.get(0);
				else
					usuario = this.crearUsuarioPorPersona(persona);
				usuario.setPersona(persona);
				usuarioDAO.save(usuario);
			}
			else
				throw new ObeliscoException("Credenciales de Usuario Incorrectas");
		}
		else
			throw new ObeliscoException("Credenciales de Usuario Incorrectas");
	}

	@Override
	public Usuario validarCredenciales(String login, String password) throws ObeliscoException {
		Usuario usuario = null;			
		List<Usuario> usuarios = getUsuarioDAO().findByProperty("login", login);
		if (usuarios != null && !usuarios.isEmpty())
			usuario = (Usuario)usuarios.get(0); 
		if (usuario == null
				|| usuario.getEstado().equals("B")
				|| usuario.getEstado().equals("L")
				|| usuario.getEstado().equals(DataGenerica.DATA_INACTIVO)
				|| !usuario.getContrasena().equals(password))
			throw new ObeliscoException("Credenciales de Usuario Incorrectas");
		cargarTransacciones(usuario);
		//cargarTransaccionesPreferidas(usuario);
		return usuario;
	}


	public Sistema getSistema() {
		return sistema;
	}

	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	public ICarpetaTransaccionDAO getCarpetaTransaccionDAO() {
		return carpetaTransaccionDAO;
	}

	public void setCarpetaTransaccionDAO(
			ICarpetaTransaccionDAO carpetaTransaccionDAO) {
		this.carpetaTransaccionDAO = carpetaTransaccionDAO;
	}

	public IUsuarioDAO getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setUsuarioDAO(IUsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

	public IServicioSeguridad getServicioSeguridad() {
		return servicioSeguridad;
	}

	public void setServicioSeguridad(IServicioSeguridad servicioSeguridad) {
		this.servicioSeguridad = servicioSeguridad;
	}
	
	public ServicioPersonaDAO getServicioPersonaDAO() {
		return servicioPersonaDAO;
	}
	
	public void setServicioPersonaDAO(ServicioPersonaDAO servicioPersonaDAO) {
		this.servicioPersonaDAO = servicioPersonaDAO;
	}

	public GrupoDAO getGrupoDAO() {
		return grupoDAO;
	}

	public void setGrupoDAO(GrupoDAO grupoDAO) {
		this.grupoDAO = grupoDAO;
	}

	public SistemaDAO getSistemaDAO() {
		return sistemaDAO;
	}

	public void setSistemaDAO(SistemaDAO sistemaDAO) {
		this.sistemaDAO = sistemaDAO;
	}

}
